package com.gome.gop.common;

import java.util.HashMap;
import java.util.Map;

/**
 * 
 * Description: 用ThreadLocal提供一个存储线程内变量的地方.
 * <p/>
 * 客户端代码可以用静态方法存储和获取线程内变量,不需要依赖于HttpSession.
 * web层的Controller可通过此处向business层传入user_id之类的变量
 * 
 */
public class SessionUitls {
    
    public static final String SESSION_ID_KEY = "SESSION_ID_KEY";
    
    public static final String CURRENT_USER_KEY = "CURRENT_USER_KEY";
    
    /** * 保存变量的ThreadLocal，保持在同一线程中同步数据. */
    @SuppressWarnings("rawtypes")
    private static ThreadLocal<Map> SESSION_MAP = new ThreadLocal<Map>();
    
    /** * 工具类的protected构造方法. */
    protected SessionUitls() {
    }
    
    /**
     * 获得线程中保存的属性.
     * 
     * @param attribute 属性名称
     * @return 属性值
     */
    public static Object get(String attribute) {
        @SuppressWarnings("unchecked")
        Map<String, Object> map = (Map<String, Object>)SESSION_MAP.get();
        return map.get(attribute);
    }
    
    /**
     * 获得线程中保存的属性，使用指定类型进行转型.
     * 
     * @param attribute 属性名称
     * @param clazz 类型
     * @param <T> 自动转型
     * @return 属性值
     */
    @SuppressWarnings("unchecked")
    public static <T> T get(String attribute, Class<T> clazz) {
        return (T)get(attribute);
    }
    
    public static String getSessionId() {
        return get(SESSION_ID_KEY, String.class);
    }
    
    /**
     * 设置制定属性名的值.
     * 
     * @param attribute 属性名称
     * @param value 属性值
     */
    public static void set(String attribute, Object value) {
        @SuppressWarnings("unchecked")
        Map<String, Object> map = (Map<String, Object>)SESSION_MAP.get();
        
        if (map == null) {
            map = new HashMap<String, Object>();
            SESSION_MAP.set(map);
        }
        
        map.put(attribute, value);
    }
    
    public static void setSessionId(String sessionId) {
        set(SESSION_ID_KEY, sessionId);
    }
    
    /**
     * 移除
     */
    public static void remove() {
        SESSION_MAP.remove();
    }
    
}
